package com.anniljing.kotlionlearn.Basic.classes

fun main() {
    println(OuterWithSimpleNested.bar)
    //Nested是嵌套静态类，所以可以直接使用OuterWithSimpleNested的.调用
    println(OuterWithSimpleNested.Nested().foo())
    //
    println(OuterWithInnerNestedClass().Nested().foo())
}

/**
 * 使用伴生对象，嵌套类访问外部类属性
 */
class OuterWithSimpleNested {
    companion object {
        var bar = 1
    }

    /*
    *普通的嵌套类无法访问外部类的属性，反编译成java语言后，发现Nested嵌套类是static静态的，所以无法访问外部类非static类型的属性
    * 如果把bar变成static类型的属性，可以访问吗？
    * kotlin中没有static属性，只能通过伴生对象
    */
    class Nested {
        fun foo() = bar
    }
}

/**
 * 使用inner class 嵌套类访问外部类的属性
 */
class OuterWithInnerNestedClass {
    private var bar = 1

    open inner class Nested {
        fun foo() = bar
    }
}
